import type { ToolInstallVersionItem } from "@/modules/dev-env/common/types.ts";
import type { DefaultOptionType } from "ant-design-vue/es/vc-select/Select";
import { mitt } from "@/framework/util/event-emitter.ts";
import type { SelectProps } from "ant-design-vue";

/**
 * 下载源数据过滤器，用于在下载列表页面过滤当前显示的数据
 */
export abstract class MirrorDataFilter<V = any> {
  /**
   * 事件对象
   */
  readonly events = mitt<{
    /**
     * 数据源发生改变
     */
    "data-source-change": void;
  }>();

  /**
   * 数据源列表，子类如果不实现{@link getDataSource0},则使用此数据
   * @private
   */
  private _dataSource?: DefaultOptionType[];

  /**
   * 下拉框的属性
   */
  selectProps?: SelectProps;

  /**
   * @param name 过滤字段显示名称
   * @param value 字段值
   */
  protected constructor(
    public readonly name: string,
    public value?: V | undefined | null,
  ) {}

  /**
   * 过滤数据
   * @param versions 版本列表
   */
  filter(versions: ToolInstallVersionItem[]): ToolInstallVersionItem[] {
    if (this.value == null || this.value === "") {
      return versions;
    }
    return this.filter0(versions);
  }

  protected abstract filter0(versions: ToolInstallVersionItem[]): ToolInstallVersionItem[];

  /**
   * 获取下拉框数据源
   */
  getDataSource(): Promise<DefaultOptionType[]> {
    if (this.getDataSource0) {
      return this.getDataSource0();
    }

    return Promise.resolve(this._dataSource || []);
  }

  /**
   * 异步获取数据源,子类实现
   * @protected
   */
  protected getDataSource0?(): Promise<DefaultOptionType[]>;

  /**
   * 手动设置数据源
   * @param dataSource
   */
  setDataSource(dataSource: DefaultOptionType[]) {
    this._dataSource = dataSource;
    this.events.emit("data-source-change");
  }
}
